#pragma once

#include <type_traits>

namespace hamster
{
    // hamster_forward Wait To Implementation !

    template<typename T>
    struct hamster_decay
    {
        #if __cplusplus >= 201703L
            using type = std::conditional_t<
                std::is_pointer_v<T>,
                std::remove_cv_t<std::remove_pointer_t<T>>,
                std::remove_cv_t<std::remove_reference_t<T>>
            >;
        #else
            using type = typename std::conditional<
                std::is_pointer<T>::value,
                std::remove_cv<typename std::remove_pointer<T>::type>::type,
                std::remove_cv<typename std::remove_reference<T>::type>::type
            >::type;
        #endif
    };

    template<typename T>
    typename hamster_decay<T>::type hamster_decay_copy(T&& value)
    {
        return std::forward<T>(value);
    }

}